/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.losalpes.compras;

import com.losalpes.datos.RepositorioDatos;
import com.losalpes.persistence.entity.Articulo;
import com.losalpes.persistence.entity.Compra;
import com.losalpes.persistence.entity.TipoMueble;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.ejb.Stateless;


/**
 *
 * @author Oscar Ballesteros
 */
@Stateless
public class ComprasServicesMock implements IComprasServices{

    private RepositorioDatos repositorio;

    public ComprasServicesMock() {
        repositorio = RepositorioDatos.getInstance();
    }

    public ArrayList<Compra> findAll()
    {
        return repositorio.getComprasRealizadas();
    }

    public Compra realizarCompra(Compra compra) {
        repositorio.getComprasRealizadas().add(compra);
        return compra;
    }

    public Integer obtenerSiguienteReferencia() {
        return repositorio.getComprasRealizadas().size() + 1;
    }

    public ArrayList<Compra> findAllByDate(Date fechaInicial, Date fechaFinal) {
        ArrayList<Compra> comprasPorFecha = new ArrayList<Compra>();

        for (Compra compra : repositorio.getComprasRealizadas()) {
            if (compra.getFechaCompra().after(fechaInicial) && compra.getFechaCompra().before(fechaFinal)) {
                comprasPorFecha.add(compra);
            }
        }

        return comprasPorFecha;
    }

    public ArrayList<Compra> findAllByCustomerId(String numeroDocumento, Date fechaInicial, Date fechaFinal) {
        ArrayList<Compra> comprasPorCliente = new ArrayList<Compra>();

        for (Compra compra : repositorio.getComprasRealizadas()) {
            if (compra.getCliente().getNumeroDocumento().equals(numeroDocumento)
                    && compra.getFechaCompra().after(fechaInicial)
                    && compra.getFechaCompra().before(fechaFinal)) {
                comprasPorCliente.add(compra);
            }
        }

        return comprasPorCliente;
    }

    public ArrayList<Articulo> findAllArticulosByTipoExterior(ArrayList<Compra> compras)
    {
        ArrayList<Articulo> tipoExterior = new ArrayList<Articulo>();
        for(Compra c : compras)
        {
            for(Articulo art : c.getArticulosComprados())
            {
                if(art.getMueble().getTipo().equals(TipoMueble.Exterior))
                {                    
                    if(!tipoExterior.contains(art))
                    {
                        tipoExterior.add(art);
                    }
                } 
            }
        }
        return tipoExterior;
    }

    public Articulo findMostSold(Date fechaInicial, Date fechaFinal, String ciudad) {
        Map<String, Integer> masVendido = new HashMap<String, Integer>();
        ArrayList<Articulo> articulos = new ArrayList<Articulo>();

        for (Compra compra : repositorio.getComprasRealizadas()) {
            if (compra.getCiudad().equals(ciudad) &&
                    compra.getFechaCompra().after(fechaInicial) &&
                    compra.getFechaCompra().before(fechaFinal)) {

                for(Articulo art : compra.getArticulosComprados())
                {
                    if (masVendido.containsKey(art.getMueble().getNombre())) {
                        for(Map.Entry<String, Integer> e : masVendido.entrySet())
                        {
                            if(art.getMueble().getNombre().equals(e.getKey()))
                            {
                                Integer contador = (Integer)e.getValue() + art.getCantidad();
                                masVendido.remove(e);
                                masVendido.put(e.getKey().toString(), contador);
                                break;
                            }
                        }
                    } else {
                        masVendido.put(art.getMueble().getNombre(), art.getCantidad());
                    }
                    articulos.add(art);
                }
            }
        }

        return this.getMasVendido(masVendido, articulos);
    }

    private Articulo getMasVendido(Map<String, Integer> masVendido, ArrayList<Articulo> articulos)
    {
        int maxValue = 0;
        String key = "";
        int num = 0;

        for(Map.Entry<String,Integer> entry: masVendido.entrySet()) {
            num +=1;
            if (entry.getValue() > maxValue) {
                maxValue = entry.getValue();
                key = entry.getKey();
            }
        }

        Articulo articulo = new Articulo();

        for (Articulo art : articulos) {
            if (art.getMueble().getNombre().equals(key)) {
                articulo = art;
                break;
            }
        }

        return articulo;
    }

    public ArrayList<Articulo> findAllArticulosByTipoInterior(ArrayList<Compra> compras)
    {
        ArrayList<Articulo> tipoInterior = new ArrayList<Articulo>();
        for(Compra c : compras)
        {
            for(Articulo art : c.getArticulosComprados())
            {
                if(art.getMueble().getTipo().equals(TipoMueble.Interior))
                {
                    if(!tipoInterior.contains(art))
                    {
                        tipoInterior.add(art);
                    }
                }
            }
        }
        return tipoInterior;
    }

    public double getTotal(ArrayList<Articulo> articulosExterior, ArrayList<Articulo> articulosInterior) {
        double total = 0;

        if (articulosExterior.size() > 0 || articulosInterior.size() > 0) {
            for (Articulo articulo : articulosInterior) {
                total = total + articulo.getTotal();                
            }

            for (Articulo articulo : articulosExterior) {
                total = total + articulo.getTotal();
            }
        }
        return total;
    }

    public ArrayList<String> findAllCities() {
        ArrayList<String> ciudades = new ArrayList<String>();

        for (Compra compra : repositorio.getComprasRealizadas()) {

            if (!ciudades.contains(compra.getCiudad())) {
                ciudades.add(compra.getCiudad());
            }
        }
        return ciudades;
    }

}
